package name.huliqing.qfaces.temp;
//package name.huliqing.qfaces.component;
//
//import java.io.IOException;
////import java.util.logging.Logger;
//import javax.faces.component.UIComponentBase;
//import javax.faces.context.FacesContext;
//import javax.faces.context.ResponseWriter;
//import name.huliqing.qfaces.QFaces;
//import name.huliqing.qfaces.render.FrameRendererUtils;
//
//public class ____20100629_Frame extends UIComponentBase {
////	private final static Logger logger = Logger.getLogger(Frame.class.getName());
//
//    // 是否自动将Frame居中,如果为true,则组件在显示时将出现在屏幕中间
//    private Boolean center;
//    // 是否使用遮罩层
//    private Boolean shade;
//    // 遮罩层的颜色,如：red,green,blue,#000000,#CCCCCC等表示颜色的值都可以
//    private String shadeColor;
//    // 遮罩层的不透明度,取值只能是 0.0 ~ 1.0之间(包括0.0, 1.0)
//    private float shadeOpaque;
//    // Event, 绑定到JavaScript Function, 当窗口打开时执行的JS函数
//    // 如果该函数返回false,则窗口将不打开
//    private String onOpen;
//    // Event, 绑定到JavaScript Function, 当窗口关闭时执行的JS函数
//    // 如果该函数返回false,则窗口将不关闭
//    private String onClose;
//    // ---- 内部参数
//    // 组件的客户端唯一ID
//    private String ID_CLIENT;
//    // hidden input组件的id,该input在客户端保存当前组件的visible状态,1可见，0不可见.
//    // 保存这个状态，以保证客户端在改变frame的可视状态并且在回传之后，组件仍能够知道
//    // 之前的可视状态，而不是每次都重置visible的状态
//    private String ID_FOR_VISIBLE_STATE;
//    private FrameRendererUtils frameRender;
//    // 保存来自于客户端的frame的可视状态
//    private Boolean visibleOnClient;
//
//    @Override
//    public void restoreState(FacesContext fc, Object state) {
//        Object[] objs = (Object[]) state;
//        super.restoreState(fc, objs[0]);
//        this.ID_FOR_VISIBLE_STATE = (String) objs[1];
//    }
//
//    @Override
//    public Object saveState(FacesContext fc) {
//        Object[] objs = new Object[2];
//        objs[0] = super.saveState(fc);
//        objs[1] = this.ID_FOR_VISIBLE_STATE;
//        return objs;
//    }
//
//    @Override
//    public String getFamily() {
//        return null;
//    }
//
//    @Override
//    public void encodeBegin(FacesContext fc) throws IOException {
//        QFaces.getResLoader2().loadJavaScript(this, "Frame.js");
//
//        // 获取默认参数
//        center = QFaces.convertToBoolean(QFaces.getAttribute(this, "center", false));
//        shade = QFaces.convertToBoolean(QFaces.getAttribute(this, "shade", false));
//        shadeColor = (String) QFaces.getAttribute(this, "shadeColor", "black");
//        shadeOpaque = QFaces.convertToFloat(QFaces.getAttribute(this, "shadeOpaque", 0.5f));
//        onOpen = (String) QFaces.getAttribute(this, "onOpen", "");
//        onClose = (String) QFaces.getAttribute(this, "onClose", "");
//
//        if (shadeOpaque > 1.0f) {
//            shadeOpaque = 1.0f;
//        }
//        if (shadeOpaque < .0f) {
//            shadeOpaque = .0f;
//        }
//
//
//        // 设置ID
//        ID_CLIENT = getClientId(fc);
//        ID_FOR_VISIBLE_STATE = ID_CLIENT + ":visible";
//
//        frameRender = new FrameRendererUtils(this, ID_CLIENT);
//        if (visibleOnClient != null) {
//            frameRender.setVisible(visibleOnClient);
//        }
//
//        // 渲染
//        ResponseWriter rw = fc.getResponseWriter();
//        frameRender.encodeBegin(rw);
//
//        // visibleState用于保存组件在客户端的可见状态，在回传时会取到该值,参见 decode
//        ClientState visibleState = new ClientState();
//        visibleState.set(this.ID_FOR_VISIBLE_STATE, (frameRender.getVisible() ? "1" : "0"));
//
//        // visibleState每次都需要重建，所以不需要保存状态。
//        visibleState.setTransient(true);
//
//        // ---- Remove 较耗时的操作!!
////		// 查找子组件中的form,如果当前组件的子组件中存在UIForm,则必须将visibleState放到这个Form中，
////		// 否则在Form提交时，组件将找不到visibleState,这会导致无法识别当前组件在客户端中的可视状态。
////		// 如果找不到子组件中的Form(Form可能不存在或者作为当前组件的父组件存在),
////		// 则直接将visibleState加到当前组件的子组件列表中
////		Long start = System.currentTimeMillis();
////		UIForm form = this.findChildForm(this);
////		logger.info("Find sub form use time=" + (System.currentTimeMillis() - start));
////		if (form != null) {
////			form.getChildren().add(visibleState);
////		} else {
////			this.getChildren().add(visibleState);
////		}
//
//        this.getChildren().add(visibleState);
//    }
//
////	/**
////	 * 从给定的组件中查找子组件中的UIForm(包含当前组件)
////	 * @param ui
////	 * @return
////	 */
////	private UIForm findChildForm(UIComponent ui) {
////		logger.fine("Find sub form.");
////		if (ui == null)
////			return null;
////		UIForm target = null;
////		if (ui instanceof UIForm) {
////			target = (UIForm) ui;
////		} else {
////			List<UIComponent> children = ui.getChildren();
////			if (children != null && !children.isEmpty()) {
////				for (UIComponent child : children) {
////					target = findChildForm(child);
////					if (target != null)
////						break;
////				}
////			}
////		}
////		return target;
////	}
//    @Override
//    public void encodeEnd(FacesContext fc) throws IOException {
//        frameRender.encodeEnd(fc.getResponseWriter());
//
//        StringBuilder jsInit = new StringBuilder("Q.F.UIFrame.init(").append(" \"" + this.ID_CLIENT + "\"").append(",\"" + this.ID_FOR_VISIBLE_STATE + "\"").append(",\"" + this.frameRender.getFrameId() + "\"").append(",\"" + this.frameRender.getHeaderId() + "\"").append(",\"" + this.frameRender.getCloseId() + "\"").append(",\"" + this.frameRender.getRenderBorder() + "\"").append(",\"" + this.frameRender.getRenderCloseButton() + "\"").append(",\"" + this.center + "\"").append(",\"" + this.shade + "\"").append(",\"" + this.shadeColor + "\"").append(",\"" + this.shadeOpaque + "\"").append(",\"" + this.onOpen + "\"").append(",\"" + this.onClose + "\"").append(")");
//        QFaces.getResLoader2().loadJavaScriptInit(this, jsInit.toString());
//    }
//
//    // -----------------------------------------------------------------
//    @Override
//    public void decode(FacesContext fc) {
//        super.decode(fc);
//        // ID_FOR_VISIBLE_STATE 必须有保存状态，这里才可用
//        String visibleState = QFaces.getParam(this.ID_FOR_VISIBLE_STATE);
//        // 让组件知道来自客户端的当前可见状态，这样在重新渲染时可同步这个状态
//        if (visibleState != null) { // 这个判断是必要的
//            visibleOnClient = ("1".equalsIgnoreCase(visibleState));
//        }
//    }
//
//    /**
//     * 渲染一个input hidden组件在客户端，用于保存客户端状态
//     * @author huliqing
//     *
//     */
//    private class ClientState extends UIComponentBase {
//
//        private String clientId;
//        private String value;
//
//        public void set(String clientId, String value) {
//            this.clientId = clientId;
//            this.value = value;
//        }
//
//        @Override
//        public String getFamily() {
//            return null;
//        }
//
//        @Override
//        public void encodeBegin(FacesContext fc) throws IOException {
//            ResponseWriter rw = fc.getResponseWriter();
//            rw.startElement("input", this);
//            rw.writeAttribute("type", "hidden", null);
//            rw.writeAttribute("id", this.clientId, null);
//            rw.writeAttribute("name", this.clientId, null); // 必要的,否则回传时取不到值
//            rw.writeAttribute("value", this.value, null);
//            rw.endElement("input");
//        }
//
//        @Override
//        public void encodeChildren(FacesContext fc) throws IOException {
//        }
//
//        @Override
//        public void encodeEnd(FacesContext fc) throws IOException {
//        }
//    }
//}
